/**
 * 技能字段定义
 * 为每个技能字段提供详细的描述注释，方便配置时参考
 */

import { SkillType, TargetType } from '../../../shared/face/enums';

/**
 * 技能配置接口 - 包含所有可能的技能字段及其描述
 */
export interface ISkillConfig {
    /** 
     * 技能唯一标识符
     * 格式：建议使用大写字母+数字，如 "A001", "P002", "AU0001"
     * 示例：A001, P002, AU0001
     */
    id: string;

    /** 
     * 技能名称
     * 显示给玩家看的技能名称
     * 示例：火焰箭, 治愈术, 勇气光环
     */
    name: string;

    /** 
     * 技能描述
     * 技能的基础描述文本，会被动态描述系统扩展
     * 示例：对敌人造成火焰伤害, 恢复目标生命值, 提升队友攻击力
     */
    description: string;

    /** 
     * 技能类型
     * 决定技能的基本行为模式
     * - 主动技能：需要主动使用，有冷却时间
     * - 被动技能：自动触发，无冷却时间
     * - 光环技能：持续效果，影响周围单位
     */
    type: SkillType;

    /** 
     * 目标类型列表
     * 定义技能可以作用的目标类型
     * - 敌方：只能对敌人使用
     * - 我方：只能对队友使用
     * - 自己：只能对自己使用
     * - 我方不含自己：对队友使用，不包括自己
     */
    targetTypes: TargetType[];

    /** 
     * 冷却时间（回合数）
     * 使用技能后需要等待的回合数才能再次使用
     * 0表示无冷却，1表示下回合可用，2表示2回合后可用
     * 示例：0, 1, 2, 3
     */
    cooldown: number;

    /** 
     * 技能等级
     * 当前技能的等级，影响技能效果
     * 范围：1 到 maxLevel
     * 示例：1, 2, 3, 5
     */
    level?: number;

    /** 
     * 最大等级
     * 技能可以达到的最高等级
     * 示例：10, 15, 20
     */
    maxLevel?: number;

    /** 
     * 技能经验
     * 当前等级的经验值，用于升级计算
     * 示例：0, 50, 100
     */
    exp?: number;

    /** 
     * 使用次数
     * 技能被使用的总次数，用于永久提升计算
     * 示例：0, 10, 100
     */
    useCount?: number;

    /** 
     * 技能品质
     * 技能的稀有度，影响获取难度和基础强度
     * 示例：1(普通), 2(稀有), 3(史诗), 4(传说)
     */
    quality?: number;

    /** 
     * 技能分类
     * 技能的功能分类，用于技能商店和筛选
     * 示例：攻击, 治疗, 辅助, 控制
     */
    classType?: string;

    /** 
     * 是否可购买
     * 该技能是否可以在商店中购买
     * 示例：true, false
     */
    notBuy?: boolean;

    /** 
     * 技能效果列表
     * 技能的具体效果，每个效果对应一个目标
     * 示例：["伤害", "添加buff-燃烧"], ["治疗", "护盾"]
     */
    effect: string[];

    /** 
     * 技能数据列表
     * 每个效果对应的具体数值和参数
     * 数组长度必须与effect数组相同
     * 示例：[{attRange: 1.2, fixed: 50}, {shield: 30}]
     */
    data: ISkillEffectData[];

    /** 
     * 永久提升配置
     * 技能使用后的永久提升效果
     * 示例：{type: "damage", amount: 1}
     */
    permanentBoost?: IPermanentBoostConfig;

    /** 
     * Buff配置列表
     * 技能会添加的Buff效果
     * 示例：[{id: "burn", duration: 3, stackCount: 1}]
     */
    buffs?: IBuffConfig[];
}

/**
 * 技能效果数据接口
 */
export interface ISkillEffectData {
    /** 
     * 攻击范围倍数
     * 基于攻击力的伤害倍数
     * 示例：1.0, 1.5, 2.0
     */
    attRange?: number;

    /** 
     * 固定伤害/效果值
     * 不受攻击力影响的固定数值
     * 示例：10, 50, 100
     */
    fixed?: number;

    /** 
     * 护盾值
     * 提供的护盾数值
     * 示例：20, 50, 100
     */
    shield?: number;

    /** 
     * 治疗量
     * 恢复的生命值
     * 示例：30, 80, 150
     */
    healing?: number;

    /** 
     * 属性修改
     * 临时或永久修改的属性值
     * 示例：{attack: 10, defense: 5}
     */
    attributeModify?: Record<string, number>;

    /** 
     * 状态效果
     * 特殊状态效果的配置
     * 示例：{type: "stun", duration: 1}
     */
    statusEffect?: IStatusEffectConfig;

    /** 
     * 永久提升配置
     * 该效果触发的永久提升
     * 示例：{type: "damage", amount: 1}
     */
    permanentBoost?: IPermanentBoostConfig;

    /** 
     * 自定义参数
     * 其他自定义参数
     * 示例：{customParam: "value"}
     */
    [key: string]: any;
}

/**
 * 永久提升配置接口
 */
export interface IPermanentBoostConfig {
    /** 
     * 提升类型
     * 永久提升的属性类型
     * 示例：damage, healing, cooldown, attRange
     */
    type: string;

    /** 
     * 提升数值
     * 每次使用技能后的永久提升量
     * 示例：1, 2, 5
     */
    amount: number;

    /** 
     * 最大提升次数
     * 永久提升的最大次数限制
     * 示例：10, 20, 无限制
     */
    maxBoosts?: number;

    /** 
     * 触发条件
     * 永久提升的触发条件
     * 示例：'always', 'kill', 'critical', 'dodge'
     */
    condition?: string;

    /** 
     * 条件参数
     * 触发条件的额外参数
     * 示例：{ minDamage: 100, targetType: 'enemy' }
     */
    conditionParams?: Record<string, any>;

    /** 
     * 条件描述
     * 触发条件的描述文本
     * 示例：'击杀敌人时', '暴击时', '闪避时'
     */
    conditionDesc?: string;
}

/**
 * Buff配置接口
 */
export interface IBuffConfig {
    /** 
     * Buff唯一标识
     * Buff的唯一标识符
     * 示例：burn, poison, shield
     */
    id: string;

    /** 
     * 持续时间
     * Buff持续的回合数，-1表示永久
     * 示例：3, 5, -1
     */
    duration: number;

    /** 
     * 最大层数
     * Buff可以叠加的最大层数
     * 示例：1, 3, 5
     */
    maxStacks?: number;

    /** 
     * 效果数值
     * Buff的具体效果数值
     * 示例：10, 20, 50
     */
    value?: number;
}

/**
 * 状态效果配置接口
 */
export interface IStatusEffectConfig {
    /** 
     * 状态类型
     * 状态效果的类型
     * 示例：stun, silence, taunt
     */
    type: string;

    /** 
     * 持续时间
     * 状态持续的回合数
     * 示例：1, 2, 3
     */
    duration: number;

    /** 
     * 效果强度
     * 状态效果的强度
     * 示例：1, 2, 5
     */
    intensity?: number;
}

/**
 * 技能配置验证器
 * 用于验证技能配置的完整性和正确性
 */
export class SkillConfigValidator {
    /**
     * 验证技能配置
     * @param config 技能配置
     * @returns 验证结果
     */
    public static validate(config: ISkillConfig): {
        isValid: boolean;
        errors: string[];
        warnings: string[];
    } {
        const errors: string[] = [];
        const warnings: string[] = [];

        // 必需字段检查
        if (!config.id) {
            errors.push('技能ID是必需的');
        }
        if (!config.name) {
            errors.push('技能名称是必需的');
        }
        if (!config.description) {
            errors.push('技能描述是必需的');
        }
        if (!config.type) {
            errors.push('技能类型是必需的');
        }
        if (!config.targetTypes || config.targetTypes.length === 0) {
            errors.push('目标类型是必需的');
        }
        if (!config.effect || config.effect.length === 0) {
            errors.push('技能效果是必需的');
        }
        if (!config.data || config.data.length === 0) {
            errors.push('技能数据是必需的');
        }

        // 数组长度检查
        if (config.effect && config.data && config.effect.length !== config.data.length) {
            errors.push('技能效果数组和技能数据数组长度必须相同');
        }

        // 数值范围检查
        if (config.cooldown < 0) {
            errors.push('冷却时间不能为负数');
        }
        if (config.level && config.level < 1) {
            errors.push('技能等级不能小于1');
        }
        if (config.maxLevel && config.maxLevel < 1) {
            errors.push('最大等级不能小于1');
        }
        if (config.level && config.maxLevel && config.level > config.maxLevel) {
            errors.push('当前等级不能超过最大等级');
        }

        // 警告检查
        if (config.cooldown === 0 && config.type === SkillType.主动技能) {
            warnings.push('主动技能通常应该有冷却时间');
        }
        if (config.cooldown > 0 && config.type === SkillType.被动技能) {
            warnings.push('被动技能通常不应该有冷却时间');
        }

        return {
            isValid: errors.length === 0,
            errors,
            warnings
        };
    }

    /**
     * 获取字段描述
     * @param fieldName 字段名
     * @returns 字段描述
     */
    public static getFieldDescription(fieldName: string): string {
        const descriptions: Record<string, string> = {
            id: '技能唯一标识符，建议使用大写字母+数字格式',
            name: '技能名称，显示给玩家看的名称',
            description: '技能描述，会被动态描述系统扩展',
            type: '技能类型：主动技能、被动技能、光环技能',
            targetTypes: '目标类型列表：敌方、我方、自己等',
            cooldown: '冷却时间（回合数），0表示无冷却',
            level: '当前技能等级，影响技能效果',
            maxLevel: '最大等级，技能可达到的最高等级',
            exp: '技能经验值，用于升级计算',
            useCount: '使用次数，用于永久提升计算',
            quality: '技能品质，影响稀有度和基础强度',
            classType: '技能分类，用于商店和筛选',
            notBuy: '是否可购买，控制商店显示',
            effect: '技能效果列表，每个效果对应一个目标',
            data: '技能数据列表，包含具体数值和参数',
            permanentBoost: '永久提升配置，技能使用后的永久效果',
            buffs: 'Buff配置列表，技能会添加的Buff效果'
        };

        return descriptions[fieldName] || '未知字段';
    }

    /**
     * 获取所有字段描述
     * @returns 所有字段描述
     */
    public static getAllFieldDescriptions(): Record<string, string> {
        return {
            id: '技能唯一标识符，建议使用大写字母+数字格式',
            name: '技能名称，显示给玩家看的名称',
            description: '技能描述，会被动态描述系统扩展',
            type: '技能类型：主动技能、被动技能、光环技能',
            targetTypes: '目标类型列表：敌方、我方、自己等',
            cooldown: '冷却时间（回合数），0表示无冷却',
            level: '当前技能等级，影响技能效果',
            maxLevel: '最大等级，技能可达到的最高等级',
            exp: '技能经验值，用于升级计算',
            useCount: '使用次数，用于永久提升计算',
            quality: '技能品质，影响稀有度和基础强度',
            classType: '技能分类，用于商店和筛选',
            notBuy: '是否可购买，控制商店显示',
            effect: '技能效果列表，每个效果对应一个目标',
            data: '技能数据列表，包含具体数值和参数',
            permanentBoost: '永久提升配置，技能使用后的永久效果',
            buffs: 'Buff配置列表，技能会添加的Buff效果'
        };
    }
}

/**
 * 技能配置示例
 * 提供各种类型技能的配置示例
 */
export const SkillConfigExamples = {
    /**
     * 主动攻击技能示例
     */
    activeAttack: {
        id: "EXAMPLE001",
        name: "火焰箭",
        description: "发射火焰箭对敌人造成伤害",
        type: SkillType.主动技能,
        targetTypes: [TargetType.敌方],
        cooldown: 2,
        level: 1,
        maxLevel: 10,
        exp: 0,
        useCount: 0,
        quality: 2,
        classType: "攻击",
        notBuy: false,
        effect: ["伤害"],
        data: [{
            attRange: 1.2,
            fixed: 30,
            permanentBoost: {
                type: "damage",
                amount: 1,
                maxBoosts: 10
            }
        }],
        buffs: [{
            id: "burn",
            duration: 3,
            maxStacks: 1,
            value: 5
        }]
    },

    /**
     * 治疗技能示例
     */
    healing: {
        id: "EXAMPLE002",
        name: "治愈术",
        description: "恢复目标生命值",
        type: SkillType.主动技能,
        targetTypes: [TargetType.我方],
        cooldown: 3,
        level: 1,
        maxLevel: 10,
        exp: 0,
        useCount: 0,
        quality: 2,
        classType: "治疗",
        notBuy: false,
        effect: ["治疗"],
        data: [{
            healing: 50,
            permanentBoost: {
                type: "healing",
                amount: 2,
                maxBoosts: 15
            }
        }]
    },

    /**
     * 被动技能示例
     */
    passive: {
        id: "EXAMPLE003",
        name: "战斗本能",
        description: "被动提升攻击力",
        type: SkillType.被动技能,
        targetTypes: [TargetType.自己],
        cooldown: 0,
        level: 1,
        maxLevel: 10,
        exp: 0,
        useCount: 0,
        quality: 3,
        classType: "被动",
        notBuy: false,
        effect: ["属性修改"],
        data: [{
            attributeModify: {
                attack: 10
            }
        }]
    },

    /**
     * 光环技能示例
     */
    aura: {
        id: "EXAMPLE004",
        name: "勇气光环",
        description: "提升队友攻击力",
        type: SkillType.光环技能,
        targetTypes: [TargetType.我方不含自己],
        cooldown: 0,
        level: 1,
        maxLevel: 10,
        exp: 0,
        useCount: 0,
        quality: 3,
        classType: "光环",
        notBuy: false,
        effect: ["属性修改"],
        data: [{
            attributeModify: {
                attack: 15
            }
        }]
    }
}; 